#ifndef PIKA_HAL_CQUEUE_H
#define PIKA_HAL_CQUEUE_H

#include "PikaObj.h"
#include "pika_platform_thread.h"

typedef struct pika_hal_cqueue_t {
    char* buffer;  // 存储元素的缓冲区（char* 可以表示任意类型的字节数组）
    size_t head;   // 队头指针
    size_t tail;   // 队尾指针
    size_t count;  // 当前元素数量
    size_t capacity; // 缓冲区容量（元素个数）
    size_t elementSize; // 每个元素的大小（字节）
#if PIKA_HAL_CQUEUE_MUTEX_ENABLE
    pika_platform_thread_lock_t lock;  // 互斥锁
#endif
} pika_hal_cqueue_t;

// 创建一个循环队列
pika_hal_cqueue_t* pika_hal_cqueue_create(size_t capacity, size_t elementSize);
// 初始化一个循环队列
int pika_hal_cqueue_init(pika_hal_cqueue_t* cque, size_t capacity, size_t elementSize);

// 向队列中添加一个元素
int pika_hal_cqueue_appendHead(pika_hal_cqueue_t* cque, const void* value);
int pika_hal_cqueue_appendTail(pika_hal_cqueue_t* cque, const void* value);

// 从队列中移除一个元素
int pika_hal_cqueue_popHead(pika_hal_cqueue_t* cque, void* value);
int pika_hal_cqueue_popTail(pika_hal_cqueue_t* cque, void* value);

// 查看但不移除队首或队尾元素
int pika_hal_cqueue_peekHead(pika_hal_cqueue_t* cque, void* value);
int pika_hal_cqueue_peekTail(pika_hal_cqueue_t* cque, void* value);

// 清理内部状态
void pika_hal_cqueue_deinit(pika_hal_cqueue_t* cque);
// 销毁对象，释放资源
void pika_hal_cqueue_delete(pika_hal_cqueue_t* cque);
// 获取队列中的元素数量
size_t pika_hal_cqueue_getCount(pika_hal_cqueue_t* cque);

// 检查队列是否为空
pika_bool pika_hal_cqueue_isEmpty(pika_hal_cqueue_t* cque);

// 检查队列是否已满
pika_bool pika_hal_cqueue_isFull(pika_hal_cqueue_t* cque);

int pika_hal_cqueue_copyAll(pika_hal_cqueue_t* cque, void* destBuffer, int maxElementCount);

#endif // PIKA_HAL_CQUEUE_H